package com.power.sifa.approve.service;

import com.plf.common.exception.BusinessException;
import com.plf.core.base.model.Ha_attachment;
import com.power.sifa.approve.model.Apl_admre_audit;
import com.power.sifa.approve.model.Apl_admreview;
import com.power.sifa.approve.model.Apl_main;
import com.power.sifa.approve.model.doc.AbstractDoc;

import java.io.InputStream;
import java.text.ParseException;
import java.util.Date;
import java.util.Map;

public interface BusinessApproveService {

    /**
     * 启动一个业务子流程
     *
     * @param applyid           申请id
     * @param proctype          操作分类
     * @param userid            用户id
     * @param username          用户username
     * @param processinstanceid
     * @param cause             案由
     * @param describe          行政复议申请
     * @param docfield          表单上的文书字段
     * @throws BusinessException
     */
    Map<String,String> startBusinessProced(String applyid, String proctype, String userid, String username, String processinstanceid, String cause,
                               String describe, Map<String, Object> docfield) throws Exception;

    /**
     * 新增一个子状态
     *
     * @param sonStatus
     * @param status
     * @return
     */
    String addSonStatus(String sonStatus, Integer status);

    /**
     * 删除一个子状态
     *
     * @param sonStatus
     * @param status
     * @return
     */
    String delSonStatus(String sonStatus, Integer status);

    /**
     * 校验是否包含子状态
     *
     * @param sonStatus
     * @param status
     * @return
     */
    Boolean checkSonStatus(String sonStatus, Integer status);

    /**
     * 创建并保存三级审批文书
     *
     * @param applyid
     * @return
     * @throws Exception
     */
    Apl_admre_audit createThreeLevelApprove(String applyid, String userid, String username, Integer type) throws Exception;


    /**
     * 获取当前时间的工作日上限
     *
     * @param date
     * @param days
     * @return
     */
    Date getTargetDay(Date date, int days);

    /**
     * 预览决定文书
     *
     * @param applyid
     * @param proctype
     * @param docfield
     * @return
     */
    InputStream previewDecisionDoc(String applyid, String proctype, Map<String, Object> docfield) throws Exception;

    /**
     * 生成案卷封面
     *
     * @param applyid
     * @param serviceType
     * @return
     */
    Ha_attachment createArchiveCover(String applyid, Integer serviceType) throws Exception;

    /**
     * 生成卷内目录
     *
     * @param applyid
     * @param serviceType
     * @return
     */
    Ha_attachment createArchiveDirectory(String applyid, Integer serviceType);

    /**
     * 生成行政复议案件备考表（封底）
     *
     * @param applyid
     * @return
     */
    Ha_attachment createArchiveBackCover(String applyid);


    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     * 通过文件名匹配文件生成文件流返回预览
     *
     * @param applyid
     * @return
     */
    InputStream previewDocByDocName(String applyid, Integer materilaType, Map<String, Object> docfield) throws Exception;

    /**
     * 预览文件保存为pdf返回
     *
     * @param applyid
     * @return
     */
    Ha_attachment previewDocSaveToPdf(String applyid, Integer materilaType, Map<String, Object> docfield) throws Exception;

    /**
     * 预览审批文书
     *
     * @param applyid
     * @return
     */
    Ha_attachment previewApproveDoc(String applyid, String modelKey, Map<String, Object> formData);

    /**
     * FIXME: 之前用于表单编辑预览，后被在线编辑替代(弃用)
     * 拼接对应的生成文书的参数
     *
     * @param applyid
     * @return
     * @throws Exception
     */
    AbstractDoc initBeforeProcess(String applyid, Integer materilaType) throws Exception;

    /**
     * 当前流程走完后更新对应的文件数据
     *
     * @param applyid
     * @param proctype
     */
    void processEndedUpdatePreviewDoc(String applyid, Integer proctype, Integer decisionType) throws Exception;

    /**
     * 模板盖章
     *
     * @param applyid
     * @param proctype
     */
    void templateStamp(String applyid, Integer proctype);

    /**
     * 计算期满日期, 当前日期按自然日顺延多少天, 最后一天是休息日顺延至下一个工作日
     *
     * @param apptype    案件类型
     * @param accepttime 受理时间
     * @return
     */
    String computeExpiryDate(Integer apptype, String accepttime);

    /**
     * 启动一个子流程
     *
     * @param faMainObj
     * @param mainObj
     * @param admreviewObj
     * @param userid
     * @param describe
     * @param status
     * @param procType
     * @param isCitymanager
     * @param isSecondOut
     * @return
     * @throws ParseException
     * @throws BusinessException
     */
    String createSonProcess(Apl_main faMainObj, Apl_main mainObj, Apl_admreview admreviewObj, String userid, String describe, Integer status, Integer procType, Integer isCitymanager, Integer isSecondOut) throws ParseException, BusinessException;


    /**
     *
     */
    void transSignMaterial();


    /**
     * 变更流程中的决定类型
     * @param f_applyid
     * @param applyid
     * @param decisiontype
     * @param decisiontypeid
     * @param decisiontypename
     */
    void changeDecisionType(String f_applyid, String applyid,Integer decisiontype, Integer decisiontypeid, String decisiontypename) throws BusinessException;
}
